1.2.6 向量拼接运算符
部分选择(Part selection)用于从向量中选择部分位。而拼接运算符a,b,c
则用于通过将向量的小部分连接在一起,从而创建更大的向量。
例如:
{3'b111, 3'b000}=> 6'b111000
{1'b1, 1'b0, 3'b101}=> 5'b10101
{4'ha, 4'd10}=> 8'b10101010 //4'ha和 4'd10在二进制中均为 4'b1010
拼接操作时,需要知道每个组成部分的宽度(否则如何确定结果的长度?)。因此,1, 2, 3
是非法的,并会导致错误信息:未指定大小的常量不允许在拼接中使用。
拼接运算符可以在赋值的左右两侧使用。
input [15:0] in;
output [23:0] out;
assign {out[7:0], out[15:8]} = in; // 交换两个字节。左右两侧均为16位向量。
assign out[15:0] = {in[7:0], in[15:8]}; // 效果相同。
assign out = {in[7:0], in[15:8]}; // 这是不同的。右侧的16位矢量扩展为
// 匹配左边的24位矢量,所以out[23:16]为零。
//在前两个示例中,out[23:16]没有赋值。
实践练习:
任务是接收几个输入向量,将它们连接成一个长向量,然后再将这个长向量分割成几个输出向量。具体来说,有六个5位的输入向量:a、b、c、d、e 和 f,这些一共构成了30位的输入数据。目标是生成四个8位的输出向量:w、x、y 和 z,总计32位的输出。输出的要求是,首先将所有的输入向量a至f按顺序连接起来,之后在这个连接后的向量末尾添加两个1位。
模块声明
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );